/** <b>meteo.java</b> - Głowna klasa komponentu, zbudowana z 3 komponenetów odczytywanie, prognoza i termometr
 * Created on 2010-03-06, 17:45:45 */

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


/** @author MACIEJ KOPLIN - 70482 TIiM, Wydział Elektroniki i Inforamtyki, Politechnika Koszalińska
* III rok, sem VI. Rok akademicki 2009/2010.
* @version meteo 1.0*/

/** <b>meteo.java</b> - Główna klasa komponentu */
public class meteo extends javax.swing.JPanel implements Serializable {

    /** Konstruktor bezparametrowy - wywołuje tworzenie okna komponentu oraz deserializację zmienych komponentu.*/
    public meteo() {
        initComponents();
    }

   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        odczytywanie1 = new odczytywanie();
        prognoza1 = new prognoza();
        jButton1 = new javax.swing.JButton();
        thermometerDemo1 = new termometer();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();

        prognoza1.setDzialaj(1);
        try {
            prognoza1.setWilg(20);
        } catch (java.beans.PropertyVetoException e1) {
            e1.printStackTrace();
        }

        jButton1.setFont(new java.awt.Font("Trebuchet MS", 0, 11));
        jButton1.setForeground(new java.awt.Color(40, 40, 40));
        jButton1.setText("Pojedynczy pomiar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setFont(new java.awt.Font("Trebuchet MS", 0, 11));
        jButton2.setForeground(new java.awt.Color(40, 40, 40));
        jButton2.setText("Systematyczny pomiar");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setFont(new java.awt.Font("Trebuchet MS", 0, 11));
        jButton3.setForeground(new java.awt.Color(40, 40, 40));
        jButton3.setText("Zapisz ostatni pomiar");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jButton4.setFont(new java.awt.Font("Trebuchet MS", 0, 11));
        jButton4.setForeground(new java.awt.Color(40, 40, 40));
        jButton4.setText("Wczytaj ostatni pomiar");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(thermometerDemo1, javax.swing.GroupLayout.PREFERRED_SIZE, 580, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(odczytywanie1, javax.swing.GroupLayout.DEFAULT_SIZE, 580, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(prognoza1, javax.swing.GroupLayout.DEFAULT_SIZE, 298, Short.MAX_VALUE)
                    .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 298, Short.MAX_VALUE)
                    .addComponent(jButton1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 298, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(jButton3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton4)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(prognoza1, javax.swing.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE)
                    .addComponent(odczytywanie1, javax.swing.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jButton3)
                            .addComponent(jButton4)))
                    .addComponent(thermometerDemo1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 291, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    /**<b>Wykonaj pojedynczy pomiar</b> Obsługa zdarzenia przycisku do wykonania pojedyneczego pomiary, komunikuje się z komponentami odczytywane;
    * @param evt - obsługa zdarzenia przycisku
    * @exception java.lang.NullPointerException e
    * @exception PropertyVetoException e
    * @throws Wyjątek może spowodować błąd synchornizacji z portem urządzenia zewnętrnzego*/
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        try{
        odczytywanie1.wykonaj();
        }
        catch(java.lang.NullPointerException e){
        t.stop();
        jButton2.setText("Systematyczny pomiar");
        JOptionPane.showMessageDialog(this, "Brak połączena! Połącz urządzenie!", "Błąd!",0);    
        }
        try {
            String czujnik=odczytywanie1.getKomunikat();
            double z=Double.parseDouble(czujnik);
            int czujnik_i=(int) z;
            prognoza1.setDzialaj(1);
            prognoza1.setTemp(czujnik_i);
            thermometerDemo1.setValue(0, czujnik_i);
            thermometerDemo1.setValue(1, prognoza1.getWilg());
            thermometerDemo1.setValue(2, prognoza1.getCisn());
        } catch (PropertyVetoException ex) {
            t.stop();
            jButton2.setText("Systematyczny pomiar");
            Logger.getLogger(meteo.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (java.lang.NumberFormatException e){
        t.stop();
        jButton2.setText("Systematyczny pomiar");}
    }//GEN-LAST:event_jButton1ActionPerformed
    
    /**<b>Wykonaj sekwencyjny pomiar</b> Obsługa zdarzenia przycisku do wykonania serii pomiarów przy uzycia timera, komunikuje się z komponentami odczytywane;
    * @param evt - obsługa zdarzenia przycisku */
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
    if(stop==false) {
      jButton1ActionPerformed(null);
      stop=true;
      t.start();
      jButton2.setText("Zatrzymaj pomiar");
      }
    else {
      stop=false;
      t.stop();
      jButton2.setText("Systematyczny pomiar");
     }
    }//GEN-LAST:event_jButton2ActionPerformed

    /**<b>Zapisz ostatni pomiar</b> Metoda obsługi przycisku i serializacja binarna i XML zmienne do pliku meteo.xml
    * @serialData - meteo.xml - serializuje do pliku zmienne
    * @serialData - meteo.bin - serializuje do pliku zmienne
    * @param evt - obsługa zdarzenia przycisku
    * @exception IOException e
    * @throws Wyjątek może spowodować błąd odczytu obiektu lub błąd tworzenia pliku*/
    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
    try {
        XMLEncoder out = new XMLEncoder(new FileOutputStream("meteo.xml"));
        out.writeObject(prognoza1.getTemp());
        out.writeObject(prognoza1.getWilg());
        out.writeObject(prognoza1.getCisn());
        out.writeObject(prognoza1.getPogoda());
        out.writeObject(prognoza1.getPrognoza());
        out.writeObject(odczytywanie1.getConnectedPort());
        out.writeObject(odczytywanie1.getKomunikat());
        out.close();
       }
   catch (IOException e) {
	e.printStackTrace();}
   try {
        BufferedWriter writer = new BufferedWriter(new FileWriter("meto.bin"));
            writer.write(String.valueOf(prognoza1.getTemp()));writer.newLine();
            writer.write(String.valueOf(prognoza1.getWilg()));writer.newLine();
            writer.write(String.valueOf(prognoza1.getCisn()));writer.newLine();
            writer.write(String.valueOf(prognoza1.getPogoda()));writer.newLine();
            writer.write(String.valueOf(prognoza1.getPrognoza()));writer.newLine();
            writer.write(String.valueOf(odczytywanie1.getConnectedPort()));writer.newLine();
            writer.write(String.valueOf(odczytywanie1.getKomunikat()));writer.newLine();
            writer.close();
       }
    catch(IOException e){}
    }//GEN-LAST:event_jButton3ActionPerformed

    /**<b>Wczytaj ostatni pomiar</b> Metoda obsługi przycisku i deserializacji XML zmienne z pliku meteo.xml
    * @serialData - meteo.xml - deserializuje z pliku zmienne
    * @param evt - obsługa zdarzenia przycisku
    * @exception IOException e
    * @throws Wyjątek może spowodować błąd odczytu obiektu lub błąd odczytu pliku*/
    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
    try {
        XMLDecoder in = new XMLDecoder(new FileInputStream("si.xml"));
	temp=(Integer)in.readObject();
        wilg=(Integer)in.readObject();
        cisn=(Integer)in.readObject();
        in.close();
        prognoza1.setTemp(temp);
        prognoza1.setWilg(wilg);
        prognoza1.setCisn(cisn);
        thermometerDemo1.setValue(0, temp);
        thermometerDemo1.setValue(1, wilg);
        thermometerDemo1.setValue(2, cisn);
        prognoza1.setDzialaj(1);
        odczytywanie1.setjTextField2(String.valueOf(temp));
       }
        catch (PropertyVetoException ex) {
            Logger.getLogger(meteo.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (IOException e) {
	    e.printStackTrace();}
    }//GEN-LAST:event_jButton4ActionPerformed

    /**Obiekt ActionListener oraz jego obsluga odpowiedzialna za timer*/
   private ActionListener zdarzenie=new ActionListener(){
        public void actionPerformed(ActionEvent e) {
           jButton1ActionPerformed(null);
        }
    };

    /** Geter pobiera wartość z czujnika
    * @return zwraca wartosć z czujnika */
    public String getKomunikat() {
        return odczytywanie1.getKomunikat();
    }

    /** Geter pobiera aktywnt porty
    * @return zwraca numer portu */
    public String getPort(){
        return odczytywanie1.getConnectedPort();
    }

    /** Geter pobiera prognoze
    * @return zwraca wartosć zminnej prognoza */
    public String getPrognoza() {
        return prognoza1.getPrognoza();
    }

    /** Geter pobiera pogode
    * @return zwraca wartosć zminnej pogoda */
    public String getPogoda() {
        return prognoza1.getPogoda();
    }

    /** Geter pobiera temperature
    * @return zwraca wartosć zminnej temp */
    public int getTemp() {
        return prognoza1.getTemp();
    }

    /** Seter ustawia zmienną temp
    * @param temp - ustawia temperature
    * @throws PropertyVetoException*/
    public void setTemp(int temp) throws PropertyVetoException {
        double old=this.temp;
        if((temp<-41) || temp>46) {
            throw new PropertyVetoException("temp",new PropertyChangeEvent(this, "temp", old, temp));
        }
        prognoza1.setTemp(temp);
        this.temp=temp;
        this.vcs.fireVetoableChange("temp", old, temp);
        this.temp=temp;
        this.pcs.firePropertyChange("temp", old, temp);
      }

    /** Geter pobiera wilgotność
    * @return zwraca wartosć zminnej wilg */
    public int getWilg() {
        return prognoza1.getTemp();
    }

    /** Seter ustawia zmienną wilg
    * @param wilg - ustawia wilgotność
    * @throws PropertyVetoException*/
    public void setWilg(int wilg) throws PropertyVetoException {
        int old=this.wilg;
        if((wilg<1) || wilg>99) {
            throw new PropertyVetoException("wilg",new PropertyChangeEvent(this, "wilg", old, wilg));
        }
        prognoza1.setWilg(wilg);
        this.wilg=wilg;
        this.vcs.fireVetoableChange("wilg", old, wilg);
        this.wilg=wilg;
        this.pcs.firePropertyChange("wilg", old, wilg);
    }

    /** Geter pobiera ciśnienie
    * @return zwraca wartosć zminnej cisn */
    public int getCisn() {
        return prognoza1.getCisn();
    }

    /** Seter ustawia zmienną cisn
    * @param cisn - ustawia ciśnienie
    * @throws PropertyVetoException*/
    public void setCisn(int cisn)throws PropertyVetoException {
        int old=this.cisn;
        if((cisn<850) || cisn>1100) {
            throw new PropertyVetoException("cisn",new PropertyChangeEvent(this, "cisn", old, cisn));
        }
        prognoza1.setCisn(cisn);
        this.cisn=cisn;
        this.vcs.fireVetoableChange("cisn", old, cisn);
        this.cisn=cisn;
        this.pcs.firePropertyChange("cisn", old, cisn);
    }

    public void setDzialaj(int z){
        prognoza1.setDzialaj(1);
    }


    /**Słuchacz propertyChange
    * @param listener */
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    /**Słuchacz removePropertyChange
    * @param listener */
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    /**Słuchacz VetoableChange
    * @param listener */
    public void addVetoableChangeListener(VetoableChangeListener listener) {
        this.vcs.removeVetoableChangeListener(listener);
    }

    /**Słuchacz removeVetoableChange
    * @param listener */
    public void removeVetoableChangeListener(VetoableChangeListener listener) {
        this.vcs.addVetoableChangeListener(listener);
    }

    private int temp;
    private int wilg;
    private int cisn;
    private final PropertyChangeSupport pcs=new PropertyChangeSupport(this);
    private final VetoableChangeSupport vcs=new VetoableChangeSupport(this); 
    private javax.swing.Timer t=new javax.swing.Timer(5000,zdarzenie);;
    private boolean stop=false;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private odczytywanie odczytywanie1;
    private prognoza prognoza1;
    private termometer thermometerDemo1;
    // End of variables declaration//GEN-END:variables
}